import java.util.*;
public class DrawLine {
    public static int[] drawLine(int length, int w, int x1, int x2, int y) {
        int[] arr = new int[length];
        
        // 计算每行有多少个整数
        int numPerRow = w / 32;
        // 计算目标行的起始索引
        int rowStart = y * numPerRow;
        
        // 确保 x1 <= x2
        if (x1 > x2) {
            int temp = x1;
            x1 = x2;
            x2 = temp;
        }
        
        // 计算在一维数组中的实际起始和结束索引
        int start = rowStart + x1 / 32;
        int end = rowStart + x2 / 32;
        
        int startBit = x1 % 32;
        int endBit = x2 % 32;
        
        for (int i = start; i <= end; i++) {
            if (i == start && i == end) {
                // 同一块内的连续位
                for (int j = startBit; j <= endBit; j++) {
                    arr[i] |= (1 << (31 - j)); // 注意：Java中int是从高位到低位存储
                }
            } else if (i == start) {
                // 起始块，从startBit到最右位
                for (int j = startBit; j < 32; j++) {
                    arr[i] |= (1 << (31 - j));
                }
            } else if (i == end) {
                // 结束块，从最左位到endBit
                for (int j = 0; j <= endBit; j++) {
                    arr[i] |= (1 << (31 - j));
                }
            } else {
                // 中间块，全部置1（即-1）
                arr[i] = -1;
            }
        }
        
        return arr;

    }

    public static void main(String[] args) {
        int[] arr = drawLine(1, 32, 30, 31, 0);
        System.out.println(Arrays.toString(arr));
    }
}
// 已知一个由像素点组成的单色屏幕，每行均有 w 个像素点，所有像素点初始为 0，左上角位置为 (0,0)。

// 现将每行的像素点按照「每 32 个像素点」为一组存放在一个 int 中，再依次存入长度为 length 的一维数组中。

// 我们将在屏幕上绘制一条从点 (x1,y) 到点 (x2,y) 的直线（即像素点修改为 1），请返回绘制过后的数组。

 

// 注意：

// 用例保证屏幕宽度 w 可被 32 整除（即一个 int 不会分布在两行上）
 

// 示例 1：

//  输入：length = 1, w = 32, x1 = 30, x2 = 31, y = 0
//  输出：[3]
//  解释：在第 0 行的第 30 位到第 31 位画一条直线，屏幕二进制形式表示为 [00000000000000000000000000000011]，因此返回 [3]
// 示例 2：

//  输入：length = 3, w = 96, x1 = 0, x2 = 95, y = 0
//  输出：[-1, -1, -1]
//  解释：由于二进制 11111111111111111111111111111111 的 int 类型代表 -1，因此返回 [-1,-1,-1]
 